/* =============================================================================
PROJET           : c-social-network
NOM DU FICHIER   : personne.c
OBJET            : Corps du module Personne
--------------------------------------------------------------------------------
DATE DE CREATION : 27/04/10
AUTEUR           : Kevin MATTIACI
--------------------------------------------------------------------------------
MODIFICATIONS (   n) date - auteur - description )
    1) 27/04/10 - Kevin MATTIACI - élaboration des algorithmes de base
    2) 27/04/10 - Benjamin MICHEL - retouches pour la compilation
    3) 28/04/10 - Benjamin MICHEL - Ajout de la fonction is_identique
    4) 28/04/10 - Benjamin MICHEL - Ajout de la fonction destroy
    5) 30/04/10 - Benjamin MICHEL - Initialisatin de la structure externe
    6) 07/05/10 - Benjamin MICHEL - fonction add_rel
    7) 09/05/10 - Joris PUECHLONG - ajout des fonctions utilisatant les etats
    8) 18/05/10 - Joris PUECHLONG - ajout de conf_dual et des fonctions
============================================================================= */

#ifndef C_PERSONNE
#define C_PERSONNE

/*Usage de NULL*/
#include <stddef.h>

/*Usage de Malloc*/
#include <stdlib.h>

/*Usage de assert*/
#include <assert.h>

/*Importation du header*/
#include "personne.h"

static t_personne* CREER_VIDE(void){
    /* Renvoie le pointeur sur NULL de type t_personne */
    return (t_personne *) NULL;
}



static t_personne* CREE(int id, char nom[], int freq){
	register int i;/* iteration */
	t_personne* pers; /* Nouvelle personne créée */

	/*Alloue l'espace pour une structure*/
	pers = ( t_personne * ) malloc( sizeof(t_personne) );
	pers->id = id;/*Copie id*/
	pers->frequence = freq;/*Copie la fréquence*/
	pers->marque = -1;/*on ne met pas de marque*/
	pers->pere = NULL;/*la personne n'a pas de pere*/
	pers->distance = -1;/*on note par default innateignable*/
	pers->conf = f_liste.creer();
	/*Copie du nom*/
	for(i = 0; i < MAX_NOM_PERSONNE ; i++)
	    pers->nom[i]=nom[i];

    /*renvoie un pointeur sur la structure créée*/
    return pers;
}



static int IS_VIDE(const t_personne *pers){
    /* Vérifie si le pointeur est NULL */
	return (pers == NULL);
}



static int GET_ID(const t_personne *pers){
	return pers->id;
}


static void GET_NOM(const t_personne* pers, char ** ch){
    register int i;/*iteration*/

    /* On vérifie que ch est un pointeur sur un pointeur sur null */
    assert(*ch == NULL);

    /*On alloue l'espace pour un tableau de MAX_NOM_PERSONNE de char*/
    *ch = (char *) malloc( sizeof(char) * MAX_NOM_PERSONNE );

	/* On copie le tableau de la structure dans ce tableau */
	for (i = 0; i < MAX_NOM_PERSONNE ; i++)
	    ( *ch )[i] = pers->nom[i];
}


static t_liste * GET_CONF(t_personne *pers){
    return pers->conf;

}


static int GET_FREQUENCE(const t_personne *pers){
	return pers->frequence;
}


static int IS_IDENTIQUE(const t_personne *pers1, const t_personne *pers2){
    /*Vérifie si ils pointent tout les deux sur le même pointeur*/
    return (pers1 == pers2);
}

static void ADD_REL(t_personne *pers1, t_personne *pers2){
	assert(IS_VIDE(pers1) == 0);
	assert(IS_VIDE(pers2) == 0);
	/* ajout une personne dans la liste conf*/
	f_liste.ajout_pers( &(pers1->conf), pers2);
}

static void DESTROY(t_personne **pers){
    /*Libère la mémoire*/
    f_liste.destroy( &(*pers)->conf );
    free(*pers);
    /*Met le pointeur à  NULL*/
    *pers=NULL;
}


static void MARQUE_NOUV (t_personne *personne){
    personne->marque = -1;/*on marque la personne*/
}


static void MARQUE (t_personne *personne){
    personne->marque = 0;/*on marque la personne*/
}

static int IS_MARQUE (t_personne *personne){
    return (personne->marque == 0);
}

static void MARQUE_VU(t_personne *personne){
    personne->marque = 1;/*on marque la personne comme vue*/
}

static int IS_VU (t_personne *personne){
    return (personne->marque >= 0);
}

static int GET_DISTANCE (t_personne *pers){
	return pers->distance;
}

static void SET_DISTANCE(t_personne *pers, int distance){
	pers->distance = distance;
}

static t_personne *GET_PERE(t_personne *pers){
	return pers->pere;
}

static void SET_PERE(t_personne *pers, t_personne *pere){
	pers->pere = pere;
}


/*
initialisation de la structure f_personne pour usage externe
*/
struct _PERSONNE f_personne = {
    CREER_VIDE, CREE, IS_VIDE, GET_ID, GET_NOM, GET_FREQUENCE, GET_CONF, IS_IDENTIQUE, ADD_REL, DESTROY, MARQUE_NOUV, MARQUE, IS_MARQUE, MARQUE_VU, IS_VU, GET_DISTANCE, SET_DISTANCE, GET_PERE, SET_PERE
};



#endif


